iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

What is Command Injection?

命令注入(Command Injection) 是一種攻擊者利用應用程式的漏洞,將未經驗證的惡意輸入作為系統命令來執行的網路攻擊類型。這類攻擊會使應用程式直接將輸入內容作為底層操作系統指令來執行,如果這些指令沒有經過適當的驗證與過濾,攻擊者便能藉此操控系統,執行任意命令,甚至完全控制伺服器。

常見的命令注入漏洞發生在程式設計不佳的應用中,當使用者輸入的內容直接嵌入到系統指令中執行時,攻擊者可插入額外的命令。例如,當應用程式中某個輸入欄位允許使用者提交查詢字串,而這些字串未經過濾,攻擊者可嘗試構建類似的惡意請求來操控系統:

正常情況下:

https://example.com/search?query=test

後端執行的查詢字串:

grep test data.txt

如果輸入未經過濾,攻擊者可藉此插入系統命令,例如:

https://example.com/search?query=test; ls

後端執行 ls 指令,列出伺服器中的檔案:

grep apple data.txt; ls

常見的攻擊目標與危害

  1. 遠端命令執行(RCE):
    攻擊者可以在目標系統上執行惡意命令,並可能取得系統完全控制權。
  2. 資料竊取與修改:
    攻擊者能讀取或修改系統中的敏感資料,例如機密檔案、使用者帳號或密碼等。
  3. 阻斷服務(DoS)攻擊:
    透過命令注入,攻擊者可以執行危險指令(如刪除系統檔案),造成伺服器當機或不可用。

Linux/Windows 常用命令

  • Linux/Unix 系統:

    • ls:列出目錄檔案
    • whoami:查看當前使用者
    • cat:讀取檔案內容
    • rm:刪除檔案或目錄
    • ifconfig:查詢網路配置
    • uname -a:顯示系統資訊
  • Windows 系統:

    • dir:列出目錄檔案
    • whoami:查看當前使用者
    • type:顯示檔案內容
    • del:刪除檔案
    • ipconfig:查詢網路配置
    • tasklist:顯示執行中的程序列表

命令連接符號

在構建命令注入攻擊時,攻擊者常利用多種連接符來串接多個指令。例如:

  • ;:終止第一個命令並執行第二個命令。例如:command1; command2
  • &&:只有當第一個命令成功時,才會執行第二個命令。例如:command1 && command2
  • ||:當第一個命令失敗時,執行第二個命令。例如:command1 || command2

防範 Command Injection

  • 輸入驗證與過濾:
    來自使用者的所有輸入應該經過嚴格的驗證和過濾,特別是特殊符號(如 ;&| 等)應進行過濾。可以使用白名單方式,僅允許合法字符。

  • 使用安全 API:
    避免直接將使用者輸入嵌入到系統指令中,例如在 PHP 中避免使用 exec()、system()。使用更安全的系統函數或 API 替代。

  • 最小權限原則:
    確保應用程式只擁有最低限度的系統權限,即使攻擊者成功注入命令,損害也能降到最低。

  • 避免暴露錯誤訊息:
    應用程式在處理指令時,應避免將具體的錯誤訊息返回給使用者,防止攻擊者根據錯誤提示進行進一步的惡意操作。

那進入今天的題目練習環節

LAB_1 - caas

https://ithelp.ithome.com.tw/upload/images/20240919/20169462Iv3jWeovXF.png

似乎可以藉由在 URL 上面打上想要的字,讓牛說出我們想讓牠說的話
https://ithelp.ithome.com.tw/upload/images/20240919/20169462pnlWqWMeWQ.png
https://ithelp.ithome.com.tw/upload/images/20240919/20169462ijoT7kmS5K.png

來看看題目附上的index.js,發現

const express = require('express');
const app = express();
const { exec } = require('child_process');

app.use(express.static('public'));

app.get('/cowsay/:message', (req, res) => {
  exec(`/usr/games/cowsay ${req.params.message}`, {timeout: 5000}, (error, stdout) => {
    if (error) return res.status(500).end();
    res.type('txt').send(stdout).end();
  });
});

app.listen(3000, () => {
  console.log('listening');
});

在第 8 行發現是使用 exec() 來執行 URL 後面的輸入,那我們先試一下基本的ls,用;閉合前面的區間。;ls後看到一個 falg.txt 的檔案
https://ithelp.ithome.com.tw/upload/images/20240919/20169462ZIkjL0Uvsq.png

接下來想辦法印出 falg.txt 的內容,一樣指令間都使用;分隔。;ls;cat falg.txt
https://ithelp.ithome.com.tw/upload/images/20240919/20169462C936E5GK7k.png

成功拿到 flag 啦~

今天的練習就到這邊,以下是參考資料,請搭配服用:
Injection Attack
Command Injection (一)
Command Injection (二)
命令執行漏洞

內文如有錯誤,還請不吝指教~


上一篇
Day4 - [Web] robots.txt
下一篇
Day6 - [Web] SQL Injection
系列文
新手村預備,CTF 小菜雞跌跌撞撞的旅程12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言